home *** CD-ROM | disk | FTP | other *** search
- #include <tos.h>
- #include <vdi.h>
- #include <aes.h>
- #include <stdio.h>
- #include <string.h>
-
- #include "mp2audio.h"
- #include "mp2wind.h"
-
- /* Functions in this module */
- void main_event_loop(void);
- void bg_event_loop(void);
- void fg_event_loop(void);
- int ev2_loop(WINDFORM *wind, int mx, int my);
- void toggle_object(WINDFORM *wind,int obj_id);
- void fg_init(WINDFORM *wind);
- int find_windform(int whandle);
- int handle_message(int pipe[8]);
- void update_objects(WINDFORM *wind,int obj_id,int depth, int pipe[8]);
- int do_formstuff(int obj_id);
- void update_time(void);
- long reset_timerc(void);
- long read_timerc(void);
- long set_timerc(void);
-
- /* global variable */
- int fgbg,closed_acc=0,file_was_open,looping=0;
- long total_time, savedtimerc;
-
- /* global variable from mp2init.c */
- extern long filepos,block;
-
- /* global variables from mp2audio.c */
- extern int fd,replay,quit,file_open;
- extern long buffer,left;
- extern char buffer_mem[(long)BLOCK_SIZE];
- extern int acc_id, vdi_id;
- extern WINDFORM windforms[5];
-
- /* Functions from mp2init.c */
- extern void init_replay(void);
- extern void continue_replay(void);
-
- /* Functions from mp2exit.c */
- extern void exit_replay(void);
- extern void pause_replay(void);
-
- /* Functions from mp2file.c */
- extern int open_file(void);
- extern int reopen_file(void);
- extern void close_file(int fd);
- extern void load(int q);
-
- /* Function from mp2info.c */
- extern int getmp2info(void);
-
- #define FG 1
- #define BG 0
-
- #define max(a,b) ((a)>(b)?(a):(b))
- #define min(a,b) ((a)<(b)?(a):(b))
-
- typedef struct { int x1,y1,x2,y2; } CORDS2;
-
- void main_event_loop()
- {
- fgbg=(_app?FG:BG);
-
- while(!quit)
- {
- if(closed_acc)
- {
- evnt_timer(1000,0);
- #ifdef DEBUG
- form_alert(1,"[1][ACC reopened][Ok]");
- #endif
- fg_init(&windforms[WIND_CTRL]);
- if(file_was_open)
- fd=reopen_file();
- closed_acc=0;
- }
- if(fgbg==FG)
- fg_event_loop();
- else if(fgbg==BG)
- bg_event_loop();
- }
-
- }
-
- /* No form window is open */
- void bg_event_loop()
- {
- int x,y,kstate,key,clicks,event,state;
- int pipe[8];
-
-
-
- #ifdef DEBUG
- form_alert(1,"[1][ACC bg][Ok]");
- #endif
- do {
- event = evnt_multi( MU_MESAG | MU_TIMER,
- 2, 0x1, 1,
- 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0,
- pipe,
- 500, 0,
- &x, &y, &state, &kstate, &key, &clicks );
-
- if (event & MU_MESAG)
- {
- handle_message(pipe); /* no window to handle */
- }
-
- if (event & MU_TIMER)
- if (replay)
- {
- load(1);
- /*
- if(total_time<=Supexec(read_timerc)/200)
- Supexec(reset_timerc);
- */
- update_time();
- }
-
- } while ((fgbg==BG) && !closed_acc);
- }
-
- /* Form window open */
- void fg_event_loop()
- {
- int x,y,kstate,key,clicks,event,state;
- int pipe[8];
- int fgexit=0,tmph;
-
- wind_open(windforms[WIND_CTRL].whandle,
- windforms[WIND_CTRL].wind.x,windforms[WIND_CTRL].wind.y,
- windforms[WIND_CTRL].wind.w,windforms[WIND_CTRL].wind.h);
- windforms[WIND_CTRL].wind_open=1;
-
- #ifdef DEBUG
- form_alert(1,"[1][ACC fg][Ok]");
- #endif
- do {
- event = evnt_multi( MU_MESAG | MU_TIMER | MU_BUTTON,
- 1, 0x3, 0x1,
- 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0,
- pipe,
- 500, 0,
- &x, &y, &state, &kstate, &key, &clicks );
-
- if (event & MU_MESAG)
- fgexit=handle_message(pipe);
-
- if (event & MU_BUTTON)
- {
- if(replay)
- windforms[WIND_CTRL].formtree[CTRL_PAUSE].ob_flags |= KEEPSELECT;
- else
- windforms[WIND_CTRL].formtree[CTRL_PAUSE].ob_flags &= ~KEEPSELECT;
- wind_get(0,WF_TOP,&tmph);
- if(tmph==windforms[WIND_CTRL].whandle)
- if(ev2_loop(&windforms[WIND_CTRL],x,y))
- event=0;
- }
-
- if (event & MU_TIMER)
- if (replay)
- {
- load(1);
- /*
- if(total_time<=Supexec(read_timerc)/200)
- Supexec(reset_timerc);
- */
- update_time();
- }
-
- if(_app)
- quit=fgexit;
- else
- if(fgexit)
- fgbg=BG;
-
- } while ((replay || fgbg==FG) && !fgexit);
- }
-
- int ev2_loop(WINDFORM *wind,int mx,int my)
- {
- int x,y,kstate,key,clicks,event,state,org_state;
- int obj_id,ev2exit,fgexit=0;
- int pipe[8];
- CORDS t;
-
-
- if((obj_id=objc_find(wind->formtree,CTRL_FIRST,1,mx,my))>=0)
- {
- if(wind->formtree[obj_id].ob_flags & SELECTABLE)
- {
- org_state=wind->formtree[obj_id].ob_state & SELECTED;
- toggle_object(wind,obj_id);
-
- objc_offset(wind->formtree,obj_id,&t.x,&t.y);
- t.w=wind->formtree[obj_id].ob_width;
- t.h=wind->formtree[obj_id].ob_height;
- ev2exit=0;
- do {
- event = evnt_multi( MU_MESAG | MU_TIMER | MU_BUTTON | MU_M1 | MU_M2,
- 1, 0x1, 0x0,
- 0, t.x, t.y, t.w, t.h,
- 1, t.x, t.y, t.w, t.h,
- pipe,
- 500, 0,
- &x, &y, &state, &kstate, &key, &clicks );
-
-
- if (event & MU_MESAG)
- fgexit=handle_message(pipe);
-
- if (event & MU_M1) /* Enter area */
- {
- if(org_state==(wind->formtree[obj_id].ob_state & SELECTED))
- toggle_object(wind,obj_id);
- }
- if (event & MU_M2) /* Leave area */
- {
- if(org_state!=(wind->formtree[obj_id].ob_state & SELECTED))
- toggle_object(wind,obj_id);
- }
-
- if (event & MU_BUTTON)
- {
- if(obj_id==objc_find(wind->formtree,CTRL_FIRST,1,x,y))
- {
- if(wind->formtree[obj_id].ob_flags & KEEPSELECT)
- {
- if(org_state && (wind->formtree[obj_id].ob_state & SELECTED))
- {
- objc_change(wind->formtree,obj_id,0,wind->form.x,
- wind->form.y,wind->form.w,wind->form.h,NORMAL,1);
- wind->formtree[wind->formtree[obj_id].ob_head].ob_x--;
- wind->formtree[wind->formtree[obj_id].ob_head].ob_y--;
- update_objects(wind,obj_id,1,0);
- }
- if(!org_state && !(wind->formtree[obj_id].ob_state & SELECTED))
- {
- objc_change(wind->formtree,obj_id,0,wind->form.x,
- wind->form.y,wind->form.w,wind->form.h,SELECTED,1);
- wind->formtree[wind->formtree[obj_id].ob_head].ob_x++;
- wind->formtree[wind->formtree[obj_id].ob_head].ob_y++;
- update_objects(wind,obj_id,1,0);
- }
- }
- else if(wind->formtree[obj_id].ob_state & SELECTED)
- {
- objc_change(wind->formtree,obj_id,0,wind->form.x,
- wind->form.y,wind->form.w,wind->form.h,NORMAL,1);
- wind->formtree[wind->formtree[obj_id].ob_head].ob_x--;
- wind->formtree[wind->formtree[obj_id].ob_head].ob_y--;
- update_objects(wind,obj_id,1,0);
- }
- fgexit=do_formstuff(obj_id);
- }
- else
- {
- objc_change(wind->formtree,obj_id,0,wind->form.x,
- wind->form.y,wind->form.w,wind->form.h,org_state,1);
- update_objects(wind,obj_id,1,0);
- }
- ev2exit=1;
- }
-
-
- if (event & MU_TIMER)
- if (replay)
- {
- load(1);
- /*
- if(total_time<=Supexec(read_timerc)/200)
- Supexec(reset_timerc);
- */
- update_time();
- }
- } while (((replay || fgbg==FG) && !fgexit) && !ev2exit);
- event=0;
- return 1;
- }
- }
- return 0;
- }
-
- void toggle_object(WINDFORM *wind,int obj_id)
- {
- if(wind->formtree[obj_id].ob_state & SELECTED)
- {
- objc_change(wind->formtree,obj_id,0,wind->form.x,
- wind->form.y,wind->form.w,wind->form.h,
- NORMAL,1);
- wind->formtree[wind->formtree[obj_id].ob_head].ob_x--;
- wind->formtree[wind->formtree[obj_id].ob_head].ob_y--;
- }
- else
- {
- objc_change(wind->formtree,obj_id,0,wind->form.x,
- wind->form.y,wind->form.w,wind->form.h,
- SELECTED,1);
- wind->formtree[wind->formtree[obj_id].ob_head].ob_x++;
- wind->formtree[wind->formtree[obj_id].ob_head].ob_y++;
- }
- update_objects(wind,obj_id,1,0);
- }
-
- void fg_init(WINDFORM *wind)
- {
- form_center(wind->formtree,&wind->form.x,&wind->form.y,
- &wind->form.w,&wind->form.h);
- wind_calc(WC_BORDER,wind->windkind,wind->form.x,wind->form.y,
- wind->form.w,wind->form.h,&wind->wind.x,&wind->wind.y,
- &wind->wind.w,&wind->wind.h);
- wind->whandle=wind_create(wind->windkind,wind->wind.x,wind->wind.y,
- wind->wind.w,wind->wind.h);
- wind_set(wind->whandle,WF_NAME,wind->wind_title);
- wind_calc(WC_WORK,wind->windkind,wind->wind.x,wind->wind.y,
- wind->wind.w,wind->wind.h,&wind->form.x,&wind->form.y,
- &wind->form.w,&wind->form.h);
- wind->formtree[wind->firstobj].ob_x=wind->form.x;
- wind->formtree[wind->firstobj].ob_y=wind->form.y;
- wind->formtree[wind->firstobj].ob_width=wind->form.w;
- wind->formtree[wind->firstobj].ob_height=wind->form.h;
- }
-
- int handle_message(int pipe[8])
- {
- static int first_open=0;
- int wnr;
-
- #ifdef DEBUG
- char tmp[128];
- #endif
-
- switch (pipe[0]) {
- case AC_OPEN:
- if (pipe[4] == acc_id)
- if(first_open)
- {
- if(windforms[WIND_CTRL].wind_open)
- wind_set(windforms[WIND_CTRL].whandle,WF_TOP);
- else
- fgbg=FG;
- }
- else
- {
- fg_init(&windforms[WIND_CTRL]);
- fgbg=FG;
- first_open=1;
- }
- #ifdef DEBUG
- form_alert(1,"[1][Got AC_OPEN][Ok]");
- #endif
- break;
- case AC_CLOSE:
- /* if (pipe[4] == acc_id) */
-
- {
- filepos=Fseek(0L,fd,1);
- #ifdef DEBUG
- sprintf(tmp,"[1][Got AC_CLOSE|ACC id: %d|pipe4: %d][Ok]",acc_id,pipe[4]);
- form_alert(1,tmp);
- #endif
-
- if(windforms[WIND_CTRL].wind_open)
- {
- wind_close(windforms[WIND_CTRL].whandle);
- wind_delete(windforms[WIND_CTRL].whandle);
- windforms[WIND_CTRL].wind_open=0;
- }
- if(windforms[WIND_INFO].wind_open)
- {
- wind_close(windforms[WIND_INFO].whandle);
- wind_delete(windforms[WIND_INFO].whandle);
- windforms[WIND_INFO].wind_open=0;
- }
- /*
- if(windforms[WIND_LYRICS].wind_open)
- {
- wind_close(windforms[WIND_LYRICS].whandle);
- wind_delete(windforms[WIND_LYRICS].whandle);
- windforms[WIND_LYRICS].wind_open=0;
- }
- */
- #ifdef DEBUG
- sprintf(tmp,"[1][Filepos: %ld][Ok]",filepos);
- form_alert(1,tmp);
- #endif
- file_was_open=file_open;
- if(file_open)
- close_file(fd);
- closed_acc=1;
- return 1;
- }
- /* break; */
-
- case AP_TERM:
- /* switch(pipe[5])
- {
- case AP_RESCHG:
- printf("Got AP_RESCHG!\n");
- break;
- case AP_TERM:
- printf("Got AP_TERM!");
- break;
- default:
- printf("Got unknown AP_TERM!");
- }
- */
- break;
- case RESCHG_COMPLETED:
- /* printf("Got RESCHG_COMPLETED!"); */
- break;
-
- case WM_REDRAW:
- if((wnr=find_windform(pipe[3]))>=0)
- update_objects(&windforms[wnr],windforms[wnr].firstobj,
- windforms[wnr].objdepth,pipe);
- break;
- case WM_MOVED:
- if((wnr=find_windform(pipe[3]))>=0)
- {
- wind_set(windforms[wnr].whandle,WF_CURRXYWH,pipe[4],pipe[5],pipe[6],pipe[7]);
- windforms[wnr].wind.x=pipe[4];
- windforms[wnr].wind.y=pipe[5];
- windforms[wnr].wind.w=pipe[6];
- windforms[wnr].wind.h=pipe[7];
- wind_calc(WC_WORK,windforms[wnr].windkind,
- windforms[wnr].wind.x,windforms[wnr].wind.y,
- windforms[wnr].wind.w,windforms[wnr].wind.h,
- &windforms[wnr].form.x,&windforms[wnr].form.y,
- &windforms[wnr].form.w,&windforms[wnr].form.h);
- windforms[wnr].formtree[windforms[wnr].firstobj].ob_x=windforms[wnr].form.x;
- windforms[wnr].formtree[windforms[wnr].firstobj].ob_y=windforms[wnr].form.y;
- windforms[wnr].formtree[windforms[wnr].firstobj].ob_width=windforms[wnr].form.w;
- windforms[wnr].formtree[windforms[wnr].firstobj].ob_height=windforms[wnr].form.h;
- if(replay)
- update_time();
- }
- break;
- case WM_CLOSED:
- if((wnr=find_windform(pipe[3]))>=0)
- {
- wind_close(windforms[wnr].whandle);
- windforms[wnr].wind_open=0;
- if(wnr==WIND_CTRL)
- {
- if(windforms[WIND_INFO].wind_open)
- {
- wind_close(windforms[WIND_INFO].whandle);
- windforms[WIND_INFO].wind_open=0;
- }
- /*
- if(windforms[WIND_LYRICS].wind_open)
- {
- wind_close(windforms[WIND_LYRICS].whandle);
- windforms[WIND_LYRICS].wind_open=0;
- }
- */
- return 1;
- }
- else
- wind_delete(windforms[wnr].whandle);
- }
- break;
- case WM_TOPPED:
- if((wnr=find_windform(pipe[3]))>=0)
- wind_set(pipe[3],WF_TOP);
- break;
- default:
- #ifdef DEBUG
- sprintf(tmp,"[1][Unimplemented message: %d][Ok]",pipe[0]);
- form_alert(1,tmp);
- #endif
- break;
- }
- return 0;
- }
-
- int find_windform(int whandle)
- {
- /* Do this more general later perhaps */
-
- if(whandle==windforms[WIND_CTRL].whandle)
- return WIND_CTRL;
- if(whandle==windforms[WIND_INFO].whandle)
- return WIND_INFO;
- /*
- if(whandle==windforms[WIND_LYRICS].whandle)
- return WIND_LYRICS;
- */
- return -1;
- }
-
- void update_objects(WINDFORM *wind,int obj_id,int depth, int pipe[8])
- {
- CORDS2 r,u,o;
- CORDS t;
-
- if(pipe)
- {
- o.x1=pipe[4]; o.y1=pipe[5];
- o.x2=pipe[4]+pipe[6]-1; o.y2=pipe[5]+pipe[7]-1;
- }
-
- graf_mouse(M_OFF,0);
- wind_update(BEG_UPDATE);
- wind_get(wind->whandle,WF_FIRSTXYWH,&t.x,&t.y,&t.w,&t.h);
- while(t.w || t.h)
- {
- if(pipe)
- {
- r.x1=t.x; r.y1=t.y;
- r.x2=t.x+t.w-1; r.y2=t.y+t.h-1;
- u.x1=max(r.x1,o.x1); u.y1=max(r.y1,o.y1);
- u.x2=min(r.x2,o.x2); u.y2=min(r.y2,o.y2);
- }
- else
- {
- u.x1=t.x; u.y1=t.y;
- u.x2=t.x+t.w-1; u.y2=t.y+t.h-1;
- }
-
- if((u.x2>=u.x1) && (u.y2>=u.y1))
- objc_draw(wind->formtree,obj_id,depth,
- u.x1,u.y1,u.x2-u.x1+1,u.y2-u.y1+1);
- wind_get(wind->whandle,WF_NEXTXYWH,&t.x,&t.y,&t.w,&t.h);
- }
- wind_update(END_UPDATE);
- graf_mouse(M_ON,0);
- }
-
- int do_formstuff(int obj_id)
- {
- static int replay_pause=0;
- int tfd;
-
- switch(obj_id)
- {
- case CTRL_STOP:
- if(replay || replay_pause)
- {
- if(windforms[WIND_CTRL].formtree[CTRL_PAUSE].ob_state & SELECTED)
- {
- objc_change(windforms[WIND_CTRL].formtree,CTRL_PAUSE,0,
- windforms[WIND_CTRL].form.x,windforms[WIND_CTRL].form.y,
- windforms[WIND_CTRL].form.w,windforms[WIND_CTRL].form.h,
- NORMAL,1);
- windforms[WIND_CTRL].formtree[windforms[WIND_CTRL].formtree[CTRL_PAUSE].ob_head].ob_x--;
- windforms[WIND_CTRL].formtree[windforms[WIND_CTRL].formtree[CTRL_PAUSE].ob_head].ob_y--;
- update_objects(&windforms[WIND_CTRL],CTRL_PAUSE,1,0);
- }
- replay_pause=0;
- exit_replay();
- Supexec(reset_timerc);
- update_time();
- }
- break;
- case CTRL_PLAY:
- if(replay_pause)
- {
- if(windforms[WIND_CTRL].formtree[CTRL_PAUSE].ob_state & SELECTED)
- {
- objc_change(windforms[WIND_CTRL].formtree,CTRL_PAUSE,0,
- windforms[WIND_CTRL].form.x,windforms[WIND_CTRL].form.y,
- windforms[WIND_CTRL].form.w,windforms[WIND_CTRL].form.h,
- NORMAL,1);
- windforms[WIND_CTRL].formtree[windforms[WIND_CTRL].formtree[CTRL_PAUSE].ob_head].ob_x--;
- windforms[WIND_CTRL].formtree[windforms[WIND_CTRL].formtree[CTRL_PAUSE].ob_head].ob_y--;
- update_objects(&windforms[WIND_CTRL],CTRL_PAUSE,1,0);
- }
- Supexec(set_timerc);
- continue_replay();
- replay_pause=0;
- }
- else
- {
- if(!replay && file_open)
- {
- replay_pause=0;
- init_replay();
- }
- else
- {
- if((tfd = open_file()) > 0)
- {
- fd=tfd;
- if(getmp2info())
- {
- Fseek(0L,fd,0);
- replay_pause=0;
- Supexec(reset_timerc);
- update_time();
- init_replay();
- }
- else
- {
- close_file(fd);
- strcpy(windforms[WIND_CTRL].wind_title,"MPEG-2");
- wind_set(windforms[WIND_CTRL].whandle,WF_NAME,
- windforms[WIND_CTRL].wind_title);
- }
-
- }
- }
- }
- break;
- case CTRL_PAUSE:
-
- if(replay_pause)
- {
- Supexec(set_timerc);
- continue_replay();
- replay_pause=0;
- }
- else
- {
- if(replay)
- {
- savedtimerc=Supexec(read_timerc);
- pause_replay();
- replay_pause=1;
- }
- }
-
- break;
- case CTRL_LOAD:
- if((tfd = open_file()) > 0)
- {
- fd=tfd;
- if(getmp2info())
- {
- if(windforms[WIND_CTRL].formtree[CTRL_PAUSE].ob_state & SELECTED)
- {
- objc_change(windforms[WIND_CTRL].formtree,CTRL_PAUSE,0,
- windforms[WIND_CTRL].form.x,windforms[WIND_CTRL].form.y,
- windforms[WIND_CTRL].form.w,windforms[WIND_CTRL].form.h,
- NORMAL,1);
- windforms[WIND_CTRL].formtree[windforms[WIND_CTRL].formtree[CTRL_PAUSE].ob_head].ob_x--;
- windforms[WIND_CTRL].formtree[windforms[WIND_CTRL].formtree[CTRL_PAUSE].ob_head].ob_y--;
- update_objects(&windforms[WIND_CTRL],CTRL_PAUSE,1,0);
- }
- Fseek(0L,fd,0);
- replay_pause=0;
- Supexec(reset_timerc);
- update_time();
- }
- else
- {
- if(windforms[WIND_CTRL].formtree[CTRL_PAUSE].ob_state & SELECTED)
- {
- objc_change(windforms[WIND_CTRL].formtree,CTRL_PAUSE,0,
- windforms[WIND_CTRL].form.x,windforms[WIND_CTRL].form.y,
- windforms[WIND_CTRL].form.w,windforms[WIND_CTRL].form.h,
- NORMAL,1);
- windforms[WIND_CTRL].formtree[windforms[WIND_CTRL].formtree[CTRL_PAUSE].ob_head].ob_x--;
- windforms[WIND_CTRL].formtree[windforms[WIND_CTRL].formtree[CTRL_PAUSE].ob_head].ob_y--;
- update_objects(&windforms[WIND_CTRL],CTRL_PAUSE,1,0);
- }
- close_file(fd);
- replay_pause=0;
- strcpy(windforms[WIND_CTRL].wind_title,"MPEG");
- wind_set(windforms[WIND_CTRL].whandle,WF_NAME,
- windforms[WIND_CTRL].wind_title);
- }
- }
- break;
- case CTRL_LOOP:
- looping=(windforms[WIND_CTRL].formtree[CTRL_LOOP].ob_state & SELECTED);
- break;
- case CTRL_INFO:
- /* Open info window */
- if(windforms[WIND_INFO].wind_open)
- wind_set(windforms[WIND_INFO].whandle,WF_TOP);
- else
- {
- fg_init(&windforms[WIND_INFO]);
- wind_open(windforms[WIND_INFO].whandle,
- windforms[WIND_INFO].wind.x,windforms[WIND_INFO].wind.y,
- windforms[WIND_INFO].wind.w,windforms[WIND_INFO].wind.h);
- windforms[WIND_INFO].wind_open=1;
- }
- break;
- case CTRL_LYRICS:
- /* Open lyrics window */
- break;
- default:
- break;
- }
- return 0;
- }
-
-
- long reset_timerc()
- {
- *((long *)0x4baL)=0L;
- return 0;
- }
- long read_timerc()
- {
- return *((long *)0x4baL);
- }
- long set_timerc()
- {
- *((long *)0x4baL)=savedtimerc;
- return 0;
- }
-
- void update_time()
- {
- long time_elap;
- char tmp[64];
-
- time_elap=total_time-Supexec(read_timerc)/200;
-
- sprintf(tmp,"%02ld:%02ld",time_elap/60,time_elap%60);
- if(strcmp(tmp,windforms[WIND_CTRL].wind_title))
- {
- strcpy(windforms[WIND_CTRL].wind_title,tmp);
- wind_set(windforms[WIND_CTRL].whandle,WF_NAME,
- windforms[WIND_CTRL].wind_title);
- }
- }
-